/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.tida.servir.pages;

import com.tida.servir.components.Envelope;
import com.tida.servir.entities.*;
import helpers.*;
import java.io.File;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import org.apache.tapestry5.ajax.MultiZoneUpdate;
import org.apache.tapestry5.annotations.*;
import org.apache.tapestry5.corelib.components.Form;
import org.apache.tapestry5.corelib.components.Zone;
import org.apache.tapestry5.hibernate.annotations.CommitAfter;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.ioc.services.PropertyAccess;
import org.apache.tapestry5.services.ApplicationGlobals;
import org.apache.tapestry5.services.Request;
import org.apache.tapestry5.upload.services.UploadedFile;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.logging.Level;
import org.apache.tapestry5.StreamResponse;
import org.apache.tapestry5.corelib.components.TextField;
import org.apache.tapestry5.ioc.Messages;
import org.apache.tapestry5.services.FieldValidatorSource;
import org.apache.tapestry5.services.Response;

/**
 *
 * @author ale
 */
public class ABMSolicitud 
{    
    @Inject
    private Session session;   
    @Inject
    private PropertyAccess _access;
    @Inject
    private Request _request;
    @InjectComponent
    private Envelope envelope;  
    
    //campos
    @Property
    @Persist
    private Funcionario trabajador;   
    @Property
    @Persist    
    private Solicitud_Acceso nuevasolicitud;    
    @Property
    @Persist
    private String bentidad;  
    @Property
    @Persist
    private DatoAuxiliar bdocumentoidentidad;  
    @PageActivationContext
    private Solicitud_Acceso bIdSolicitud_Acceso;//en caso se desee editar... 
    @Property
    @Persist
    private boolean ventanaNuevo;//hay dos casos la creacion y la edicion
    @Property
    @Persist
    private String bnroDocumento;  
    @Property
    @Persist
    private String bapellidoPaterno;  
    @Property
    @Persist
    private String bapellidoMaterno;  
    @Property
    @Persist
    private String bnombres;  
    @Property
    @Persist
    private String bemailLaboral;  
    @Property
    @Persist
    private String btelefonofijo;  
    @Property
    @Persist
    private String bnum_resolucion;
    @Property
    @Persist
    private String bcargo;
    
    @Property
    @Persist
    private String bdocumento_adjunto;
    @Component(id = "formSolicitud")
    private Form formSolicitud;
    @Component(id = "formsubida")
    private Form formsubida;
    @InjectComponent
    private Zone solicitudZone;
    @InjectComponent
    private Zone DarBajaZone;
    @InjectComponent
    private Zone CargarDocumentoZone;    
    @Property
    @Persist
    private String fecharesolu;
    @Property
    @Persist    
    private UploadedFile fileNuevo;
    @Property
    @Persist    
    private UploadedFile fileEditar;
    
    //campos modal
    @Property
    @Persist
    private String bdenoentidad;
    @Property
    @Persist
    private LkBusquedaEntidad rowentidad;
    @InjectComponent
    private Zone busquedamodalZone;
    @Property
    @Persist
    private Entidad selecentidad;
    @Property
    @Persist
    private boolean mostrarlista;
    @Persist
    private String nombreArchivo;
    @Persist
    private String lugarArchivo ;    
    @Property
    @Persist
    private File copied;
    @Property
    @Persist
    private Boolean procesoFin;
    @Property
    @Persist
    private Boolean procesoConfirmarDarBaja;
    @Property
    @Persist
    private Boolean etapaInicio;
    @Property
    @Persist
    private Boolean respuestaOk;
    @Inject
    private ApplicationGlobals globals;
    @Persist
    private long traba;
    @Persist 
    private long entidad;
    @Property
    @Persist
    private Perfil bperfil;
    @Persist    
    private String STARTPATH;
    
    @Property
    @Persist
    private Boolean datosPersonalesDisabled;
    
    @Property
    @Persist
    private Boolean solicitanteEsFuncionario;//si quien hace la solicitud esta en la tabla funcionario
    
    @Property
    @Persist
    private Usuario usuarioDarBaja;
    
    @Property
    @Persist
    private String mensajeErrorRENIEC;
    
    @Persist
    private Usuario usuarioSolicitud;
    @Property
    @Persist
    private int maxlength;
    @Persist 
    private String regeVali;
    @InjectComponent 
    private TextField nrodocumento; 
    @Inject 
    private FieldValidatorSource fieldValidatorSource; 
    @Inject
    private Messages messages;
    
    public org.apache.tapestry5.FieldValidator getValidator() {
        //return new FieldValidator().getValidator(nrodocumento, regeVali);
            return fieldValidatorSource.createValidators(nrodocumento, "required,regexp="+regeVali); 
    }
    
    // inicio de la pagina
    @Log
    @SetupRender
    private void inicio() 
    {
        nuevasolicitud = new Solicitud_Acceso();
        usuarioSolicitud=new Usuario();
        STARTPATH      = getRuta().get(0).getRuta_final();
        if ( bIdSolicitud_Acceso != null )
            {
//                Solicitud_Acceso solicitudObservada;
//                solicitudObservada   = (Solicitud_Acceso) session.load(Solicitud_Acceso.class, Long.parseLong( bIdSolicitud_Acceso ));                
                nuevasolicitud=bIdSolicitud_Acceso;
//                if ( solicitudObservada != null )
//                {
                    ventanaNuevo     = false;
                    
                    bnombres         = nuevasolicitud.getTrabajador().getNombres();
                    bapellidoPaterno = nuevasolicitud.getTrabajador().getApellidoPaterno();
                    bapellidoMaterno = nuevasolicitud.getTrabajador().getApellidoMaterno();
                    bemailLaboral    = nuevasolicitud.getTrabajador().getEmail();
                    btelefonofijo    = nuevasolicitud.getTrabajador().getTelefono();
                    bcargo           = nuevasolicitud.getTrabajador().getDen_cargo();
                    bperfil          = nuevasolicitud.getPerfil();
                    bnum_resolucion  = nuevasolicitud.getNum_resolucion();
                    
                    SimpleDateFormat formatoDelTexto;
                    formatoDelTexto  = new SimpleDateFormat("dd/MM/yyyy");                    
                    fecharesolu      = formatoDelTexto.format( nuevasolicitud.getFec_resolucion() ); 
                    usuarioSolicitud = (Usuario) session.load(Usuario.class, getUsuarioBySolicitudID(null,nuevasolicitud.getId(),null).get(0).getId());
                                        
//                  bentidad         = solicitudObservada.getEntidad().getDenominacion();
//                  selecentidad     = solicitudObservada.getEntidad();
//                  entidad          = solicitudObservada.getEntidad().getId();
                    
                    bentidad         = usuarioSolicitud.getEntidad().getDenominacion();
                    selecentidad     = usuarioSolicitud.getEntidad();
                    entidad          = usuarioSolicitud.getEntidad().getId();
                    
                    bdocumentoidentidad = nuevasolicitud.getTrabajador().getDocumentoidentidad();
                    bnroDocumento       = nuevasolicitud.getTrabajador().getNroDocumento();
                    
                    trabajador          = nuevasolicitud.getTrabajador();
                    
                    bdocumento_adjunto  = nuevasolicitud.getDocumento();
//                }      
                    bIdSolicitud_Acceso=null;
            }  
    }
    
    @Log
    public List<ConfiguracionAcceso> getRuta() {
        Criteria c = session.createCriteria(ConfiguracionAcceso.class);        
        return c.list();
    }
    
    @Log
    void onActivate() 
    {   
        if (etapaInicio == null) 
        {
            etapaInicio              = true;
            procesoFin               = false;
            procesoConfirmarDarBaja  = false;
            usuarioDarBaja           = new Usuario();
            datosPersonalesDisabled  = true;
            solicitanteEsFuncionario = true;
            
            ventanaNuevo             = true;           
           
        }        
    }
    
//    @Log
//    public com.tida.servir.services.GenericSelectModel<DatoAuxiliar> getBeandocumentoidentidad() {
//        List<DatoAuxiliar> list = Helpers.getDatoAuxiliar("DOCUMENTOIDENTIDAD", null, 0, session);
//        return new com.tida.servir.services.GenericSelectModel<DatoAuxiliar>(list, DatoAuxiliar.class, "abrev", "id", _access);        
//    }
    
    @Log
    public com.tida.servir.services.GenericSelectModel<DatoAuxiliar> getBeandocumentoidentidad() {
        List<Long> lista = new ArrayList<Long>();
        lista.add(new Long(1));lista.add(new Long(2));
        Criteria c = session.createCriteria(DatoAuxiliar.class);
        c.add(Restrictions.eq("nombreTabla","DOCUMENTOIDENTIDAD"));
        c.add(Restrictions.in("codigo", lista));
        return new com.tida.servir.services.GenericSelectModel<DatoAuxiliar>(c.list(), DatoAuxiliar.class, "abrev", "id", _access);
    }
    
    @Log
    public com.tida.servir.services.GenericSelectModel<Perfil> getBeanperfil() {
        List<Perfil> list;
        Criteria c = session.createCriteria(Perfil.class);
        c.add(Restrictions.in( "id", new Long[] { 3L, 5L} ));
        list = c.list();
        return new com.tida.servir.services.GenericSelectModel<Perfil>(list, Perfil.class, "descperfil", "id", _access);
    }
    
    @Log
    public List<LkBusquedaTrabajador> getTrabajador(String nrodocumento) throws ParseException {
        Criteria criterio = session.createCriteria(LkBusquedaTrabajador.class);
        criterio.add(Restrictions.eq("estado", true));
        criterio.add(Restrictions.eq("entidad_id", selecentidad.getId()));
        criterio.add(Restrictions.eq("nrodocumento",nrodocumento));
        return criterio.list();
    }
    
    @Log
    public List<Funcionario> getFuncionario(Long tipoDocumento, String nrodocumento) 
        throws ParseException 
    {        
        Criteria criterio = session.createCriteria(Funcionario.class);
        //criterio.add(Restrictions.eq("estado", true));
        criterio.add(Restrictions.eq("documentoidentidad.id", tipoDocumento));
        criterio.add(Restrictions.eq("nroDocumento",nrodocumento));
        
        return criterio.list();        
    }
    
    @Log
    public List<LkBusquedaPerfilEntidad> getUsuarioAdministrador(Long entidadID) 
        throws ParseException 
    {        
        Criteria criterio = session.createCriteria(LkBusquedaPerfilEntidad.class);
        criterio.add(Restrictions.eq("estadousuario", 1L));
        criterio.add(Restrictions.eq("entidadid", entidadID));               
        criterio.add(Restrictions.eq("perfilid", 3L));     
        return criterio.list();        
    }
    
    @Log
    public List<LkBusquedaEntidad> getListadoEntidades() 
    {
         Criteria c = session.createCriteria(LkBusquedaEntidad.class);
         c.add(Restrictions.eq("estado", true));
         if (bdenoentidad != null) {
            c.add(Restrictions.disjunction().
                    add(Restrictions.like("denominacion", "%" + bdenoentidad + "%").ignoreCase()).
                    add(Restrictions.like("denominacion", "%" + bdenoentidad.replaceAll("ñ", "n") + "%").ignoreCase()).
                    add(Restrictions.like("denominacion", "%" + bdenoentidad.replaceAll("n", "ñ") + "%").ignoreCase()).
                    add(Restrictions.like("descriptores", "%" + bdenoentidad + "%").ignoreCase()).
                    add(Restrictions.like("descriptores", "%" + bdenoentidad.replaceAll("ñ", "n") + "%").ignoreCase()).
                    add(Restrictions.like("descriptores", "%" + bdenoentidad.replaceAll("n", "ñ") + "%").ignoreCase()).
                    add(Restrictions.like("SIGLA", "%" + bdenoentidad + "%").ignoreCase()).
                    add(Restrictions.like("SIGLA", "%" + bdenoentidad.replaceAll("ñ", "n") + "%").ignoreCase()).
                    add(Restrictions.like("SIGLA", "%" + bdenoentidad.replaceAll("n", "ñ") + "%").ignoreCase())                    
                    );
         }
         nroentidad = Integer.toString(c.list().size());
         return c.list();
    }
    
    @Persist
    @Property
    private String nroentidad; 
     
    @Log
    Object onActionFromSeleccionarentidad(Entidad enti) {         
        bentidad=enti.getDenominacion();
        selecentidad=enti;
        entidad=enti.getId();
        return this;
    }
    @Log
    @CommitAfter
    Object onSuccessFromformbusquedaentidad() {   
        mostrarlista=true;
        return busquedamodalZone.getBody();
    }
        
    Object onBuscartraba()
    {        
        formSolicitud.clearErrors();
        bnombres=null;
        bapellidoPaterno=null;
        bapellidoMaterno=null;
        bemailLaboral=null;
        btelefonofijo=null;
        bcargo=null;
        
        datosPersonalesDisabled = true; 
        solicitanteEsFuncionario= true;
        
        if(selecentidad==null){
            formSolicitud.recordError("Tiene que seleccionar la Entidad");
            return solicitudZone.getBody();
        }
        if(bdocumentoidentidad==null){
            formSolicitud.recordError("Tiene que ingresar Tipo de Documento");
            return solicitudZone.getBody();
        }
        if(bnroDocumento==null){
            formSolicitud.recordError("Tiene que ingresar Numero de Documento");
            return solicitudZone.getBody();
        }      
        
        try{
            List<Funcionario> busqueda=getFuncionario(bdocumentoidentidad.getId(), bnroDocumento);
            if(busqueda.size()>0){
                
                bnombres=busqueda.get(0).getNombres();
                bapellidoPaterno=busqueda.get(0).getApellidoPaterno();
                bapellidoMaterno=busqueda.get(0).getApellidoMaterno();
                bemailLaboral=busqueda.get(0).getEmail();
                btelefonofijo=busqueda.get(0).getTelefono();
                bcargo=busqueda.get(0).getDen_cargo();
                trabajador=(Funcionario) session.load(Funcionario.class, busqueda.get(0).getId());
                traba=trabajador.getId();
            }else{
                                    
                if ( bdocumentoidentidad.getId() == 190L ){//Tipo de documento DNI

                    try {
                        
                        ServicioReniec treniec = new ServicioReniec();
                        treniec.obtenerToken();
                                                
                        if (treniec.validarToken(session) == true) 
                        {
                            System.out.println("BUSCAR DNI");                            
                            List<String> result  = treniec.obtenerResultado(bnroDocumento);                            
                            mensajeErrorRENIEC   = "";
                            
                            if (validarEstadoConsulta(result.get(0), session) == true) 
                            {
                                System.out.println("Paterno : " + result.get(1));
                                System.out.println("Materno : " + result.get(2));
                                System.out.println("Nombre : " + result.get(4));
                                
                                bnombres         = result.get(1);
                                bapellidoPaterno = result.get(2);
                                bapellidoMaterno = result.get(4);

                                solicitanteEsFuncionario =  false;
                            } else {
                                System.out.println( "mensajeErrorRENIEC :" + mensajeErrorRENIEC );
                                
                                if ( result.get(0).equals( "DNE" ) ){                                   
                                    formSolicitud.recordError("El DNI consultado es inválido.");                                
                                } else {
                                    formSolicitud.recordError("Hubo un error en el Sistema, intentarlo luego.");                                
                                }
                            }
                        } else {
                            System.out.println( "Token no valido." );
                            formSolicitud.recordError("Hubo un error en el Sistema, intentarlo luego.");                                
                        }                        
                        
                    } catch( Exception ex ) {
                        System.out.println(ex.toString());
                        formSolicitud.recordError("Hubo un error en el Sistema. Por favor intentarlo luego.");                                
                    }
                    
                } else {
                    //si elige por i.e. C.E. permitir ingresar datos personales
                    datosPersonalesDisabled = false;
                    solicitanteEsFuncionario = false;
                }
                    
                return solicitudZone.getBody();
            }
        }catch(Exception ex){
            
        }
        
        return solicitudZone.getBody();        
    }
    
    @Log
    void onBnroDocumentoChanged() {
        bnroDocumento=_request.getParameter("param");
    }
    Object onReset() {
        bnombres=null;
        bapellidoPaterno=null;
        bapellidoMaterno=null;
        bemailLaboral=null;
        btelefonofijo=null;
        bcargo=null;
        bentidad=null;
        bdocumentoidentidad=null;
        bnroDocumento=null;
        nuevasolicitud=new Solicitud_Acceso();
        trabajador=null;
        selecentidad=null;
        fecharesolu=null;
        
        datosPersonalesDisabled = true;
        solicitanteEsFuncionario = true;
        
        return this;
    }
    
    Object onCancel() {
        return "Index";
    }
    
    Object onCancelar() {
        etapaInicio = true;
        procesoFin = false;
        procesoConfirmarDarBaja = false;
                
        return this;         
    }
    
    @Log
    @CommitAfter
    Object onSuccessFromformSolicitud(){
        
        if(trabajador==null){
            
            if (solicitanteEsFuncionario ) {
                formSolicitud.recordError("Tiene que Buscar un Trabajador");
                
                return solicitudZone.getBody();
            } else{
                // si no es funcionario grabar los datos personales en la tabla Funcionario
            }
        }
        if(bemailLaboral==null){
            formSolicitud.recordError("Tiene que ingresar Email");
            return solicitudZone.getBody();
        }
        if(btelefonofijo==null){
            formSolicitud.recordError("Tiene que ingresar Telefono");
            return solicitudZone.getBody();
        }
        if(bcargo==null){
            formSolicitud.recordError("Tiene que ingresar Cargo");
            return solicitudZone.getBody();
        }
        if(bperfil==null){
            formSolicitud.recordError("Tiene que ingresar Perfil");
            return solicitudZone.getBody();
        }

        //check si hay un administrador para la entidad seleccionada
        if(trabajador!=null){
            List<UsuarioTrabajador> listUsuarios;
            listUsuarios = getUsuarios(trabajador.getId(),"3",null);

            if(listUsuarios.size()>0){
                formSolicitud.recordError("Lo sentimos. Tiene una Solicitud de Acceso por Aprobación.");
                return solicitudZone.getBody();
            }

            listUsuarios = getUsuarios(trabajador.getId(),"1",selecentidad.getId());

            if(listUsuarios.size()>0){
                formSolicitud.recordError("Lo Sentimos. Ya cuenta con un Usuario en la misma Entidad.");
                return solicitudZone.getBody();
            }
        }
        
        if ( bperfil.getId() == 3L ){ //ADMINISTRADOR SANCIONES ENTIDAD
           try
            {            
                List<LkBusquedaPerfilEntidad> listaAdmin = getUsuarioAdministrador( selecentidad.getId() );
                if ( listaAdmin.size()> 0 ){

                    usuarioDarBaja.setNombres( listaAdmin.get(0).getNombres());
                    usuarioDarBaja.setApellidoPaterno( listaAdmin.get(0).getApellidoPaterno());
                    usuarioDarBaja.setApellidoMaterno( listaAdmin.get(0).getApellidoMaterno());

                    etapaInicio = false;
                    procesoConfirmarDarBaja = true;
                    respuestaOk=false;

                    return new MultiZoneUpdate("solicitudZone", solicitudZone.getBody())
                            .add("DarBajaZone", DarBajaZone.getBody());                
                }

            } catch( Exception ex ){
            } 
        }
        
        etapaInicio = false;
        procesoFin = true;
        respuestaOk=false;
            
        return new MultiZoneUpdate("solicitudZone", solicitudZone.getBody())                         
                        .add("CargarDocumentoZone", CargarDocumentoZone.getBody());    
    }
    
   
    
    @Log
    @CommitAfter
    Object onSuccessFromformconfirmarbaja()
    {
        etapaInicio = false;
        procesoFin = true;
        respuestaOk=false;
        procesoConfirmarDarBaja = false;
            
        return this;  
    } 
    
    @Log
    @CommitAfter
    Object onSuccessFromformsubida(){
        int error=0;
        formsubida.clearErrors();
        if (fecharesolu != null) {
            SimpleDateFormat formatoDelTexto = new SimpleDateFormat("dd/MM/yyyy");
            try {
                nuevasolicitud.setFec_resolucion((Date) formatoDelTexto.parse(fecharesolu));
            } catch (ParseException ex) {
                ex.printStackTrace();
            }
        } 
        if(nuevasolicitud.getFec_resolucion().after(new Date())){
            formsubida.recordError("La Fecha de Resolucion no debe ser mayor a la Actual");
            error=1;
        }
        Date date = new Date();
        int aleatorio = (int) (Math.random() * 1000 + 1);
        SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
//        nombreArchivo = file.getFileName().substring(0, file.getFileName().length() - 4);
//        lugarArchivo = STARTPATH + "/" + nombreArchivo + "-" +sdf.format(date)+ "-"+aleatorio+"/";
//        String archivoSOlI = lugarArchivo + file.getFileName();           
//        System.out.println("aquiiiii"+segunda);
//        copied = new File(lugarArchivo);
//        if (!copied.exists()) {
//            copied.mkdirs();
//        }
//        File nuevo = new File(archivoSOlI);
//        file.write(nuevo);
        
        UploadedFile file;
        Boolean blGrabarArchivo = true;
        
        if ( nuevasolicitud.getId()==0 )
        {
            file = fileNuevo;
            blGrabarArchivo = true;
        }
        else 
        {
            file = fileEditar;
            if ( fileEditar == null )
            {            
                blGrabarArchivo = false;
            }
        }
        
//        if ( blGrabarArchivo )
//        {        
            String path = STARTPATH + "documentosolicitud/";            

            //valida extension del archivo        
            String sArchivoExtension;
            sArchivoExtension = getExtension( file.getFileName() );
            if(sArchivoExtension.equals("ERROR")){
                formsubida.recordError("El nombre del archivo no puede contener puntos.");
                return this;                
            }
            else if ( sArchivoExtension.equalsIgnoreCase( "pdf" ) || sArchivoExtension.equalsIgnoreCase( "jpg" ) 
                || sArchivoExtension.equalsIgnoreCase( "doc" ) || sArchivoExtension.equalsIgnoreCase( "docx" ) ){

                //extension valida
            } else {
                formsubida.recordError("Solo puede subir archivos con la siguiente extension: .pdf, .jpg, .doc, .docx");
                error=1;
            }

            //valida tamanio maximo de carga
            int iTamanioMaximo = 3145728;
            if ( file.getSize() > iTamanioMaximo ){
                formsubida.recordError("El tamaño maximo de carga del documento es 3MB");
                error=1;
            }
            if(error==1){
                return this;
            }
            
            String[] strings = file.getFileName().split("\\.");
            String nombreArchivos = strings[0].replaceAll(" ", "") +(sdf.format( date ) + "-" + aleatorio ) 
                    + "."+strings[1];
                    
            File nuevo = new File(path + nombreArchivos);
            copied = new File(path);
            if (!copied.exists()) {
                copied.mkdirs();
            }
            
            file.write(nuevo);
            nuevasolicitud.setDocumento( path + nombreArchivos );        
//        }
        if( trabajador == null )
            trabajador = new Funcionario();
        
            trabajador.setNombres(bnombres.toUpperCase());
            trabajador.setApellidoPaterno(bapellidoPaterno.toUpperCase());
            trabajador.setApellidoMaterno(bapellidoMaterno.toUpperCase());
            trabajador.setEmail(bemailLaboral);
            trabajador.setTelefono(btelefonofijo);
            trabajador.setDen_cargo(bcargo.toUpperCase()); 
            trabajador.setNroDocumento(bnroDocumento.toUpperCase());
            trabajador.setFlg_usuario(true);
            
            DatoAuxiliar docuIdentidadNuevo;
            docuIdentidadNuevo =  new DatoAuxiliar();
            docuIdentidadNuevo.setId( bdocumentoidentidad.getId() );
            
            trabajador.setDocumentoidentidad(docuIdentidadNuevo);            
            
            session.saveOrUpdate(trabajador);
     
        
//        if ( bIdSolicitud_Acceso == null )
//        {
//            // nueva solicitud
//        } 
//        else 
//        {
//            // se edita una solicitud
//            nuevasolicitud=bIdSolicitud_Acceso;
//            bIdSolicitud_Acceso=null;
//        }
        
        nuevasolicitud.setTrabajador(trabajador);
        //nuevasolicitud.setEstado(new Long(1));    
        nuevasolicitud.setPerfil(bperfil);
//        nuevasolicitud.setEntidad(selecentidad);        
        nuevasolicitud.setNum_resolucion(bnum_resolucion);
        session.saveOrUpdate(nuevasolicitud);
        session.flush();
        
        //registrar usuario        
        
        usuarioSolicitud.setEstado(3);
        usuarioSolicitud.setIntentos_fallidos(0L);
        usuarioSolicitud.setLogin(nuevasolicitud.getTrabajador().getNroDocumento());
        usuarioSolicitud.setEntidad(selecentidad);            
        usuarioSolicitud.setRolid(new Long(2));
        usuarioSolicitud.setTrabajador(nuevasolicitud.getTrabajador());
        usuarioSolicitud.setFecha_creacion(new Date());
        usuarioSolicitud.setNombres(nuevasolicitud.getTrabajador().getNombres());
        usuarioSolicitud.setApellidoPaterno(nuevasolicitud.getTrabajador().getApellidoPaterno());
        usuarioSolicitud.setApellidoMaterno(nuevasolicitud.getTrabajador().getApellidoMaterno());
        usuarioSolicitud.setApellidoMaterno(nuevasolicitud.getTrabajador().getApellidoMaterno());
        usuarioSolicitud.setEmaillaboral(nuevasolicitud.getTrabajador().getEmail());
        usuarioSolicitud.setTelefono(nuevasolicitud.getTrabajador().getTelefono());
        usuarioSolicitud.setNumeroDocumento(nuevasolicitud.getTrabajador().getNroDocumento());
        usuarioSolicitud.setDocumentoId(nuevasolicitud.getTrabajador().getDocumentoidentidad().getId());
        usuarioSolicitud.setSolicitudacceso(nuevasolicitud);
        session.saveOrUpdate(usuarioSolicitud);
        session.flush();
        
        ConfiguracionAcceso ca = (ConfiguracionAcceso) session.load(ConfiguracionAcceso.class, 1L);
        new Logger().loguearEvento(session, Logger.SOLICITUD_SANCION, entidad, trabajador.getId(), 0, Logger.MOTIVO_SOLICITUD_SANCION, nuevasolicitud.getId());        
        
        if (SMTPConfig.sendMail("Datos de acceso al Modulo de Sanciones - Servir", "Su solicitud de usuario de acceso al RNSDD estará siendo procesada dentro de las 48 horas", bemailLaboral, ca)) {
            System.out.println("Envío Correcto");
        } else{                
                Logger logger = new Logger();
                logger.loguearEvento(session, logger.ERROR_SERVIDOR_DE_CORREO, entidad, trabajador.getId(),0, Logger.CORREO_FAIL_RESET_PASSWORD, 0); 
        }
        
        bnombres=null;        
        bapellidoPaterno=null;
        bapellidoMaterno=null;
        bemailLaboral=null;
        btelefonofijo=null;
        bcargo=null;
        bentidad=null;
        bdocumentoidentidad=null;
        bnroDocumento=null;
        nuevasolicitud=new Solicitud_Acceso();
        trabajador=null;
        selecentidad=null;
        fecharesolu=null;
        etapaInicio = true;
        procesoFin = false;
        procesoConfirmarDarBaja= false;
        respuestaOk=true;
        
        datosPersonalesDisabled = true;
        solicitanteEsFuncionario = true;
        
        return "ABMSolicitud";
    }
    
    @Log
    Object onValueChangedFromTipo_documento(DatoAuxiliar dato){
        if(dato!=null){
            if(dato.getCodigo()==1){
                //mensajeVali="El número de DNI debe tener 8 dígitos (y solo números)";
                regeVali="^[0-9]{8}$";
                maxlength=8;
            }
            else{
                //mensajeVali="";
                regeVali="^[a-zA-Z0-9]{12}$";
                maxlength=12;
            }                
        }     
        return new MultiZoneUpdate("solicitudZone", solicitudZone.getBody());
    }
    
    @Log
    public List<UsuarioTrabajador> getUsuarios(Long trabajadorid,String estado,Long entidadid){
        Criteria c = session.createCriteria(UsuarioTrabajador.class);
        if(trabajadorid!=null)
            c.add(Restrictions.eq("trabajadorid", trabajadorid));
        if(estado!=null)
            c.add(Restrictions.eq("estado", Integer.parseInt(estado)));
        if(entidadid!=null)
            c.add(Restrictions.eq("entidadid", entidadid));
        return c.list();
    }  
    
    @Log
    public List<UsuarioTrabajador> getUsuarioBySolicitudID(Long trabaid,Long solicitudid,Long usuarioid){
        Criteria c = session.createCriteria(UsuarioTrabajador.class);
        if(trabaid!=null)
            c.add(Restrictions.eq("trabajadorid", trabaid));
        if(solicitudid!=null)
            c.add(Restrictions.eq("solicitudid", solicitudid));
        if(usuarioid!=null)
            c.add(Restrictions.ne("id", usuarioid));
        return c.list();
    }
    
    static public String getExtension(String path) 
    {
        String[] strings = path.split("\\.");
        if(strings.length>2){
            return "ERROR";
        }else{
            return strings[strings.length - 1];
        }
        
    }
    
    @Log
    public Boolean validarEstadoConsulta(String estado,Session session){

        System.err.println("estado validar consulta: "+estado);

        if ("NTP".equals(estado)) { mensajeErrorRENIEC="No tienen permisos de acceso al método consulta.";return false; } 
        if ("SINV".equals(estado)) { mensajeErrorRENIEC="Código de Sesión ingresado inválido.";return false; } 
        if ("UNL".equals(estado)) { mensajeErrorRENIEC="Aplicación que consulta a Web Service no se ha autenticado.";return false;} 
        if ("5".equals(estado)) { mensajeErrorRENIEC="Excedió el máximo número de consultas asignadas por día.";return false;} 
        if ("3".equals(estado)) { mensajeErrorRENIEC="Esta consultando en un día y hora no permitido según convenio.";return false;} 
        if ("DNE".equals(estado)) { mensajeErrorRENIEC="El DNI consultado es inválido.";return false;} 
        if ("DNV".equals(estado)) { mensajeErrorRENIEC="El DNI del usuario de la empresa es inválido. No está autorizado a consultar.";return false;} 
        if ("0002".equals(estado)) { mensajeErrorRENIEC="El Servidor no puede atender el requerimiento.";return false;}
        //OK
        if ("0000".equals(estado)) { return true;}

        mensajeErrorRENIEC = "Error no identificado";
        
        return false;
    }
    
    StreamResponse onActionFromReturnStreamResponse() 
    {
        return new StreamResponse() {
                InputStream inputStream;

            @Override
            public void prepareResponse(Response response) {
                File fileADescargar = new File( bdocumento_adjunto );

                try {
                    inputStream = new FileInputStream(fileADescargar);
                } catch (FileNotFoundException ex) {
//                    java.util.logging.Logger.getLogger(batch_dev.class.getName()).log(Level.SEVERE, null, ex);
                }

                try {
                    response.setHeader("Content-Type", "application/x-zip");
                    response.setHeader("Content-Disposition", "inline; filename="+fileADescargar.getName());
                    response.setHeader("Content-Length", "" + inputStream.available());
                }
                catch (IOException e) {
//                    java.util.logging.Logger.getLogger(batch_dev.class.getName()).log(Level.SEVERE, null, e);
                }
            }

            @Override
            public String getContentType() {
                return "application/x-zip";
            }

            @Override
            public InputStream getStream() throws IOException {
                return inputStream;
            }

        };
    }
    
}
